package com.island.util;



import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 有关时间操作的实用函数集合
* 
* @author wdd
* @version 1.0
* @time 2012年03月09日11时03分14秒.531
* @attention 修改后，运行程序，取得当前时间，修改历史记录
* 
*/
/**
* 在SimpleDateFormat的构造函数中指定模式，比如:
* 
* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);
* 
* 也可以获取时间格式的时候使用applyPattern函数临时指定:
*   SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
*   sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
*   String timeStr = sdf.format(new Date());
* 
* 什么字符代表什么，这是j2se约定好的，设置模式的时候，我们可以使用约定好的字符加上任何我们想要的字符串。
* 
* j2se对字符所代表的模式的约定列表如下：
* 
* Letter Date or Time Component Presentation
* G  Era designator   Text
* y  Year     Year
* M  Month in year   Month
* w  Week in year   Number
* W  Week in month   Number
* D  Day in year    Number
* d  Day in month   Number
* F  Day of week in month Number
* E  Day in week    Text
* a  Am/pm marker   Text
* H  Hour in day (0-23)  Number
* k  Hour in day (1-24  Number
* K  Hour in am/pm (0-11) Number
* h  Hour in am/pm (1-12) Number
* m  Minute in hour   Number
* s  Second in minute  Number
* S  Millisecond    Number
* z  Time zone    General time zone
* Z  Time zone    RFC 822 time zone
* 
* */
public class TimeUtils {
/**
  * 将当前时间格式化成“yyyy年MM月dd日HH时mm分ss秒.SSS”
  * 
  * @return 格式化后的当前时间
  */
public  String getNowTime() {
  return formatTime(null, null);
}
/**
  * 得到当前时间的毫秒数
  * 
  * @return 当前时间的毫秒数
  */
public long getCurrentMilliseconds() {
  Calendar cal = Calendar.getInstance();
  return cal.getTimeInMillis();
}
/**
  * 将要格式化的时间格式成“yyyy年MM月dd日HH时mm分ss秒.SSS”
  * 
  * @param originalTime
  *            需要被格式化的时间
  * @return 已格式化的时间
  */
public  String formatTime(Date originalTime) {
  return formatTime(originalTime, null);
}
/**
  * 将当前时间格式化成指定格式
  * 
  * @param format
  *            指定格式
  * @return 格式化后的当前时间
  */
public  String formatTime(String format) {
  return formatTime(null, format);
}
/**
  * 格式化时间
  * 
  * @param originalTime
  *            需要被格式化的时间
  * @param format
  *            格式
  * @return desttime 已格式化的时间
  */
public  String formatTime(Date originalTime, String format) {
  String destTime = null;
  if (originalTime == null) {
   originalTime = Calendar.getInstance().getTime();
  }
  if (format == null) {
   format = "yyyy年MM月dd日HH时mm分ss秒.SSS";
  }
  // 设置时间格式
  SimpleDateFormat dateFormat = new SimpleDateFormat(format);
  try {
   // 格式化时间
   destTime = dateFormat.format(originalTime);
  } catch (Exception ex) {
   System.out.println("格式化时间失败：");
   System.out.println(ex.getMessage());
  }
  return destTime;
}
/**
  * 计算两个时间之间相隔天数
  * 
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
public int getIntervalDays(Calendar startDay, Calendar endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   Calendar cal = startDay;
   startDay = endDay;
   endDay = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startDay.getTimeInMillis();
  long el = endDay.getTimeInMillis();
  long ei = el - sl;
  // 根据毫秒数计算间隔天数
  return (int) (ei / (1000 * 60 * 60 * 24));
}
/**
  * 计算两个时间之间相隔天数
  * 
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
public int getIntervalDays(Date startDay, Date endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   Date cal = startDay;
   startDay = endDay;
   endDay = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startDay.getTime();
  long el = endDay.getTime();
  long ei = el - sl;
  // 根据毫秒数计算间隔天数
  return (int) (ei / (1000 * 60 * 60 * 24));
}
/**
  * 精确计算两个时间之间相隔天数
  * 
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
public int getDaysBetween(Calendar startDay, Calendar endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   java.util.Calendar swap = startDay;
   startDay = endDay;
   endDay = swap;
  }
  int days = endDay.get(Calendar.DAY_OF_YEAR)
    - startDay.get(Calendar.DAY_OF_YEAR);
  int y2 = endDay.get(Calendar.YEAR);
  if (startDay.get(Calendar.YEAR) != y2) {
   startDay = (Calendar) startDay.clone();
   do {
    // 得到当年的实际天数
    days += startDay.getActualMaximum(Calendar.DAY_OF_YEAR);
    startDay.add(Calendar.YEAR, 1);
   } while (startDay.get(Calendar.YEAR) != y2);
  }
  return days;
}
/**
  * Calendar转化为Date
  * 
  * @param calendar
  *            Calendar对象
  * @return Date对象
  */
public Date calendarToDate(Calendar calendar) {
  Date date = calendar.getTime();
  return date;
}
/**
  * Date转化为Calendar
  * 
  * @param date
  *            Date对象
  * @return Calendar对象
  */
public Calendar dateToCalendar(Date date) {
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  return cal;
}
/**
  * 计算两个时间之间相隔毫秒数
  * 
  * @param startTime
  *            开始时间
  * @param endTime
  *            结束时间
  * @return 相隔毫秒数
  */
public long getIntervalMilliseconds(Calendar startTime, Calendar endTime) {
  // 确保startday在endday之前
  if (startTime.after(endTime)) {
   Calendar cal = startTime;
   startTime = endTime;
   endTime = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startTime.getTimeInMillis();
  long el = endTime.getTimeInMillis();
  return el - sl;
}
/**
  * 计算两个时间之间相隔毫秒数
  * 
  * @param startTime
  *            开始时间
  * @param endTime
  *            结束时间
  * @return 相隔毫秒数
  */
public long getIntervalMilliseconds(Date startTime, Date endTime) {
  // 确保startday在endday之前
  if (startTime.after(endTime)) {
   Date cal = startTime;
   startTime = endTime;
   endTime = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startTime.getTime();
  long el = endTime.getTime();
  return el - sl;
}
/**
  * 计算某一月份的最大天数
  * @param year 年
  * @param month 月
  * @return 某一月份的最大天数
  */
public int maxDaysOfMonth(int year, int month) {
  Calendar time = Calendar.getInstance();
  time.clear();
  time.set(Calendar.YEAR, year);
  time.set(Calendar.MONTH, month -1);// 注意,Calendar对象默认一月为0
  int day = time.getActualMaximum(Calendar.DAY_OF_MONTH);// 本月份的天数
  // 注：在使用set方法之前，必须先clear一下，否则很多信息会继承自系统当前时间
  return day;
}
/**
  * 主函数，测试本类
  * @param args
  */
public static void main(String[] args) {
  TimeUtils tu = new TimeUtils();
  System.out.println("现在时间是 : " + tu.getNowTime());
  String time = tu.getNowTime();
  int year = Integer.parseInt(time.substring(0, 4));
  
  int month = Integer.parseInt(time.substring(5, 7));
  System.out.println(tu.maxDaysOfMonth(year, month));
}
}
